Solidity EVM Assembly
bytecode全体の構成
https://blog.zeppelin.solutions/deconstructing-a-solidity-contract-part-ii-creation-vs-runtime-6b9d60ecb44c
https://cdn.rawgit.com/ajsantander/23c032ec7a722890feed94d93dff574a/raw/a453b28077e9669d5b51f2dc6d93b539a76834b8/BasicToken.svg
creation code
デプロイ時に使われる部分
コンストラクタに渡すパラメータの取得
コンストラクタの実行
runtime codeをコピーして返す
など
runtime code
実際にチェーン上に記録され、transaction実行時に呼ばれる部分
Function Selector
Function Wrapper
Function Body(関数本体)
など
Free memory pointer
https://solidity.readthedocs.io/en/v0.4.25/miscellaneous.html#layout-in-memory
https://y-nakajo.hatenablog.com/entry/2018/06/09/030734
自由に使えるメモリの位置を指すポインタ
code: free memory pointer
000 PUSH1 80
002 PUSH1 40
003 MSTORE
0x00 ~ 0x7f は予約領域なのでbytecode実行時には 0x80 が指定される
Function Selector
https://blog.zeppelin.solutions/deconstructing-a-solidity-contract-part-iii-the-function-selector-6a9b6886ea49
https://solidity.readthedocs.io/en/v0.4.25/abi-spec.html#function-selector
どの関数を実行するかを選ぶところ
具体的な関数のIDなどは Function Selector 参照
Function Wrapper
WIP
その他
Solidity Layout of State Variables in Storage
SolidityとVyperのコンパイル戦略
Vyper Memory Layout
参考リンク
全般的なチュートリアル、ドキュメント
https://solidity.readthedocs.io/en/v0.4.25/assembly.html
https://github.com/androlo/solidity-workshop#advanced-solidity-tutorial
https://blog.zeppelin.solutions/deconstructing-a-solidity-contract-part-i-introduction-832efd2d7737
assembly実装例など
https://github.com/0xProject/0x-monorepo/blob/67e689158f63dfd34948bac653e37199e5c07193/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC20Proxy.sol#L34
https://github.com/uport-project/uport-identity/blob/a87dce102afb5428effefd99f700af85ca3ea76f/contracts/TxRelay.sol#L62
https://github.com/OpenZeppelin/openzeppelin-solidity/blob/9b3710465583284b8c4c5d2245749246bb2e0094/contracts/introspection/ERC165Checker.sol#L127
https://github.com/gnosis/MultiSigWallet/blob/1584998e8f2164cb35f24996b945e05e4271c95f/contracts/MultiSigWallet.sol#L246
https://github.com/OpenZeppelin/openzeppelin-solidity/blob/9b3710465583284b8c4c5d2245749246bb2e0094/contracts/cryptography/ECDSA.sol#L35
https://github.com/gnosis/safe-contracts/blob/102e632d051650b7c4b0a822123f449beaf95aed/contracts/libraries/MultiSend.sol
その他
https://g.solidity.cc/
#Solidity #EVM